package com.define.ssh.common;

import java.beans.PropertyDescriptor;
import java.sql.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;

/**
 * @ClassName: JSONUtils
 * @author vincent_wu
 * @date 2012-7-22 下午02:50:42
 * @remark
 */
public class JsonUtil {

	public static String stringToJson(String s) {
		if (s == null) {
			return nullTOJson();
		}
		final StringBuilder sb = new StringBuilder();
		for (int i = 0; i < s.length(); i++) {
			final char ch = s.charAt(i);
			switch (ch) {
			case '"':
				sb.append("\\\"");
				break;
			case '\\':
				sb.append("\\\\");
				break;
			case '\b':
				sb.append("\\b");
				break;
			case '\f':
				sb.append("\\f");
				break;
			case '\n':
				sb.append("\\n");
				break;
			case '\r':
				sb.append("\\r");
				break;
			case '\t':
				sb.append("\\t");
				break;
			case '/':
				sb.append("\\/");
				break;
			default:
				if (ch >= '\u0000' && ch <= '\u001F') {
					final String ss = Integer.toHexString(ch);
					sb.append("\\u");
					for (int k = 0; k < 4 - ss.length(); k++) {
						sb.append('0');
					}
					sb.append(ss.toUpperCase());
				} else {
					sb.append(ch);
				}
			}
		}
		return sb.toString();
	}

	/***
	 * 对象转换成为json 这里是描述这个方法的作用
	 * 
	 * @return
	 */
	public static String objectToJson(Object obj) {
		final StringBuffer json = new StringBuffer();
		if (obj == null) {
			json.append("\"\"");
		} else if (obj instanceof Integer) {
			json.append("\"").append(numberToJson((Integer) obj)).append("\"");
		} else if (obj instanceof Boolean) {
			json.append("").append(booleanToJson((Boolean) obj)).append("");
		} else if (obj instanceof String) {
			json.append("\"").append(stringToJson(obj.toString())).append("\"");
		} else if (obj instanceof Object[]) {
			json.append("\"").append(arrayToJson((Object[]) obj)).append("\"");
		} else if (obj instanceof List) {
			json.append("").append(listToJson((List<?>) obj)).append("");
		} else if (obj instanceof Map) {
			json.append("\"").append(mapToJson((Map<?, ?>) obj)).append("\"");
		} else if (obj instanceof java.sql.Date) {
			json.append("\"").append(dateToJson((Date) obj)).append("\"");
		}

		// else if (obj instanceof java.util.Date) {
		// json.append("\"").append(dateToJson((Date) obj)).append("\"");
		// }
		else {
			json.append("\"").append(stringToJson(obj.toString())).append("\"");
		}
		return json.toString();
	}

	/**
	 * 这里是描述这个方法的作用
	 * 
	 * @param obj
	 * @return {["pname":"val"],["pname":"val"]...}
	 */
	public static String beanToJson(Object obj) {
		final StringBuffer json = new StringBuffer("{");
		try {
			final PropertyDescriptor[] pds = PropertyUtils
					.getPropertyDescriptors(obj);
			if (pds != null && pds.length > 0) {
				for (final PropertyDescriptor pd : pds) {
					if (pd.getName().equals("class"))
						continue;
					final String pname = objectToJson(pd.getName());
					final String val = objectToJson(pd.getReadMethod().invoke(
							obj));
					json.append(pname);
					json.append(":");
					json.append(val);
					json.append(",");
				}
				json.setCharAt(json.length() - 1, '}');
			} else {
				json.append("}");
			}
		} catch (final Exception e) {
			e.printStackTrace();
		}
		return json.toString();
	}

	public static String beanToJson(Object obj, String params) {
		final StringBuffer json = new StringBuffer("{");
		try {
			final PropertyDescriptor[] pds = PropertyUtils
					.getPropertyDescriptors(obj);
			if (pds != null && pds.length > 0) {
				for (final PropertyDescriptor pd : pds) {
					String pname = pd.getName();
					if (pname.equals("class"))
						continue;
					if (params.indexOf(pname) == -1)
						continue;
					pname = objectToJson(pname);
					final String val = objectToJson(pd.getReadMethod().invoke(
							obj));
					json.append(pname);
					json.append(":");
					json.append(val);
					json.append(",");
				}
				json.setCharAt(json.length() - 1, '}');
			} else {
				json.append("}");
			}
		} catch (final Exception e) {
			e.printStackTrace();
		}
		return json.toString();
	}

	/**
	 * 这里是描述这个方法的作用
	 * 
	 * @param obj
	 * @return
	 */
	public static String mapToJson(Map<?, ?> map) {
		final StringBuilder json = new StringBuilder();
		json.append("{");
		if (map != null && map.size() > 0) {
			for (final Object key : map.keySet()) {
				json.append("" + objectToJson(key) + "");
				json.append(":");
				json.append("" + objectToJson(map.get(key)) + "");
				json.append(",");
			}
			json.setCharAt(json.length() - 1, '}');
		} else {
			json.append("}");
		}
		return json.toString();
	}

	/**
	 * 这里是描述这个方法的作用
	 * 
	 * @param obj
	 * @return
	 */
	public static String listToJson(List<?> list) {
		final StringBuffer json = new StringBuffer();
		json.append("[");
		if (list != null && list.size() > 0) {
			for (final Object obj : list) {
				json.append(beanToJson(obj));
				json.append(",");
			}
			json.setCharAt(json.length() - 1, ']');
		} else {
			json.append("]");
		}
		return json.toString();
	}

	public static String listToJson(List<?> list, String params) {
		final StringBuffer json = new StringBuffer();
		json.append("[");
		if (list != null && list.size() > 0) {
			for (final Object obj : list) {
				json.append(beanToJson(obj, params));
				json.append(",");
			}
			json.setCharAt(json.length() - 1, ']');
		} else {
			json.append("]");
		}
		return json.toString();
	}

	/**
	 * 这里是描述这个方法的作用
	 * 
	 * @param obj
	 * @return
	 */
	private static String arrayToJson(Object[] array) {
		final StringBuilder json = new StringBuilder();
		json.append("{");
		if (array != null && array.length > 0) {
			for (final Object obj : array) {
				json.append(objectToJson(obj));
				json.append(",");
			}
			json.setCharAt(json.length() - 1, ']');
		} else {
			json.append("}");
		}
		return json.toString();
	}

	public static String dateToJson(Date date) {
		return date.toString();
	}

	public static String numberToJson(Number number) {
		return number.toString();
	}

	public static String booleanToJson(Boolean bool) {
		return bool.toString();
	}

	public static String nullTOJson() {
		return "";
	}

	/**
	 * 非空验证 这里是描述这个方法的作用
	 * 
	 * @param arg0
	 * @return
	 * 
	 */
	public static Boolean isNull(Object arg0) {
		if (arg0 == null)
			return true;
		final String arg = (String) arg0;
		return ("".equals(arg.trim()) || "null".equals(arg)) ? true : false;
	}
}